package com.data;

import java.io.*;
import java.util.*;

/**
 * Classe mae responsavel pela leitura dos dados no disco.
 * @author Jean Vasconcelos, Carla Sukeyosi, Matheus Emanuel, Heitor Carvalho
 */
public class IODataHandler
{
    //Caminho do diretorio dos contatos
    public static final String contactPath = "src" + File.separator + "com" + File.separator
            + "files" + File.separator + "contacts" + File.separator;
    //Caminho do diretorio dos eventos
    public static final String eventPath = "src" + File.separator + "com" + File.separator
            + "files" + File.separator + "events" + File.separator;
    //Caminho do arquivo com as informacoes do usuario
    public static final String userPath = "src"+ File.separator +"com"+ File.separator +
            "files"+ File.separator +"userInfo";
    //Caminho do arquivo com as informacoes dos grupos
    public static final String groupPath = "src"+ File.separator +"com"+ File.separator +
            "files"+ File.separator +"groups.txt";
    
    private FileInputStream fis;
    private ObjectInputStream in;
    private FileOutputStream fos;
    private ObjectOutputStream out;
    
    /**
     * Metodo utilizado para ler objetos Object do disco
     * @param caminho do diretorio de onde ser quer ler a informacao
     * @return uma lista de objetos do tipo Object
     */
    public List<Object> loadData(String path)
    {
        List<Object> result = new ArrayList<Object>();
        File dir = new File(path);
        File[] files = dir.listFiles();

        try 
        {
            for (File file : files)
            {
                if (!file.toURI().toURL().toString().contains(".svn"))
                {
                    fis = new FileInputStream(file);
                    in = new ObjectInputStream(fis);
                    Object obj = (Object) in.readObject();
                    
                    result.add(obj);
                }
            }
            in.close();
            return result;
        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }
        return result;
    }
    
    public Object loadUserInfo (String path)
    {
            try 
            {
                File dir = new File(path);
                fis = new FileInputStream(dir);
                in = new ObjectInputStream(fis);
                
                Object obj = (Object) in.readObject();
                
                in.close();
                
                return obj;
            }
            catch (ClassNotFoundException ex)
            {
                System.out.println(ex.getMessage());
            }
            catch (IOException ex)
            {
                System.out.println(ex.getMessage());
            }
            return null;
    }
    /**
     * Salva um objeto serializavel num arquivo
     * @param vo objeto a ser salvo.
     * @param path caminho do objeto a ser salvo.
     * @return verdadeiro caso o objeto seja serializado com sucesso.
     */
    public boolean saveData(Object vo, String path, boolean userInf)
    {
        try 
        {
            fos = new FileOutputStream(path + (!userInf ? vo.hashCode(): ""));
            out = new ObjectOutputStream(fos);
            out.writeObject(vo);
            out.close();     
            return true;
        }
        catch (IOException ex)
        {
            System.out.println(ex.getMessage());
            return false;
        }
    }
    
    /**
     * Exclui um arquivo do disco.
     * @param hashCode do objeto a ser excluido.
     * @param path caminho do obejto a ser excluído.
     * @return true, no caso do arquivo ser excluido com sucesso.
     */
    public boolean remove(Object object, String path) 
    {
        File file = new File(path + object.hashCode());
        return file.delete();
    }
    
    /**
     * Exclui uma imagem do disco.
     * @param path caminho do objeto a ser excluído.
     * @return true, no caso da imagem ser excluida com sucesso.
     */
    public static boolean removeImage(String path) 
    {
        File file = new File(path);
        return file.delete();
    }
    
    /**
     * Metodo que salva o nome dos grupos de contatos em um arquivo
     * @param names nomes dos grupos
     * @return verdadeiro para o caso de salvo os nomes no arquivo
     */
    public boolean saveGroupNames (List<String> names, String path)
    {
        String content = "";
        for (String name : names)
        {
            content += name + "\n";
        }
        try
        {  
            BufferedWriter bw = new BufferedWriter(new FileWriter(path, false));   
            bw.write(content);
            bw.close();
            return true;
        }  
        catch(IOException ex)
        {  
            System.out.println(ex.getMessage());
            return false;
        }  
    }
    
    /**
     * Metodo que carrega o nome dos grupos do sistema
     * @param path caminho do arquivo onde os nomes estao salvos
     * @return lista com nome dos grupos
     */
    public List<String> loadGroupNames (String path)
    {
        try
        {  
            BufferedReader br = new BufferedReader(new FileReader(path));
            
            ArrayList<String> names = new ArrayList<String>();
            String aux = "";
            while (br.ready()) 
            {
                aux = br.readLine();
                names.add(aux);
            }
            br.close();
            return names;
        }  
        catch(IOException ex)
        {  
            System.out.println(ex.getMessage());
        }  
        return null;
    }
}
